// 反应堆模式
// 什么叫做Reactor 基于事件来处理业务和逻辑，就是一个东西里面有很多的节点，哪个节点就绪就处理那个节点这就是反应堆模式
#include <iostream>
#include <string>
#include "Logger.hpp"
#include "reactor.hpp"
#include "Connection.hpp"
#include "Listener.hpp"
#include "Parser.hpp"
#include "Protocol.hpp"
#include "Calculator.hpp"
void Usag(std::string buffer)
{
    std::cout << buffer << "+ port";
}
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        std::string buffer = argv[0];
        Usag(argv[0]);
        exit(0);
    }
    EnableConsoleLogStrategy();

    // 1. 业务对象
    std::unique_ptr<Calculator> cal = std::make_unique<Calculator>();

     // 2. 协议和解析协议对象
    std::unique_ptr<Parser> parse_protocol = std::make_unique<Parser>(
        [&cal](Request &req)->Response{
            return cal->Exec(req);
        }
    );

    uint16_t port = std::stoi(argv[1]);
    // 3. 链接处理
    std::shared_ptr<Connection> listen = std::make_shared<Listener>(port);
    listen->SetCb(
        [&parse_protocol](std::string &inbuffer)->std::string{
            return parse_protocol->Parse(inbuffer);
        }
    );
    std::unique_ptr<Reactor> server = std::make_unique<Reactor>();

    server->AddConnection(listen);

    server->Loop();
}